# 导包
import pymysql


# 创建类
class DBUtil:
    # 初始化
    __conn = None
    __cursor = None

    # 创建连接
    @classmethod
    def __get_conn(cls):
        # 如果连接对象不存在，就创建；如果存在，直接使用；
        # return返回连接对象
        if cls.__conn is None:
            cls.__conn = pymysql.connect(host="211.103.136.244",
                                           port=7061,
                                           user="student",
                                           password="iHRM_student_2022",
                                           database="test_db",
                                           charset="utf8")
        return cls.__conn

    # 创建游标
    @classmethod
    def __get_cursor(cls):
        if cls.__cursor is None:
            # 通过调用封装的获取连接的方法、return回要使用的连接对象
            cls.__cursor = cls.__get_conn().cursor()
        return cls.__cursor

    # 执行sql
    @classmethod
    def exe_sql(cls, sql):
        try:
            # 获取游标
            cursor = cls.__get_cursor()
            # 执行sql语句
            cursor.execute(sql)
            # 如果是查询：
            # split() : 拆分字符串、默认按照空格进行拆分
            # lower()： 将字符串内容转换为全小写
            # upper(): 将字符串内容转换为全大写
            if sql.split()[0].lower() == "select":
            # if sql.split()[0].upper() == "SELECT":
                # 返回查询结果
                return cursor.fetchall()
            # 否则：
            else:
                # 提交事务
                cls.__conn.commit()
                # 返回受影响结果行数
                return cursor.rowcount
        except Exception as e:
            # 抛出异常
            print(e)
            # 回滚事务
            cls.__conn.rollback()
        finally:
            # 关闭游标
            cls.__close_cursor()
            # 关闭连接
            cls.__close_conn()

    # 关闭游标
    @classmethod
    def __close_cursor(cls):
        # 如果游标对象不为空，就调用close方法进行关闭操作
        if cls.__cursor:
            cls.__cursor.close()
            cls.__cursor = None

    # 关闭连接
    @classmethod
    def __close_conn(cls):
        # 如果连接对象不为空，就调用close方法进行关闭操作
        if cls.__conn:
            cls.__conn.close()
            cls.__cursor = None

